import { ref, computed } from 'vue'
import { defineStore } from 'pinia'

const USER_KEY = 'OA_USER_KEY'
const TOKEN_KEY = 'OA_TOKEN_KEY'

export const PermissionChoices = {
    // 所有权限
    All: 0b111,
    // 普通员工权限
    Staff: 0b000,
    // 需要董事会权限
    Boarder: 0b001,
    // TeamLeader权限
    Leader: 0b010,
  }


export const useAuthStore = defineStore('auth', () => {

    let _user = ref({})
    let _token = ref("")

    function setUserToken(user, token) {
        //保存在对象上(内存中，方便随时读取)
        _user.value = user;
        _token.value = token;

        //存储到浏览器的locaStorage上(硬盘上)
        localStorage.setItem(USER_KEY, JSON.stringify(user))
        localStorage.setItem(TOKEN_KEY, token)
    }

    //计算属性
    let user = computed(()=>{
        //如果_user是一个空对象，那么就试图从LocalStorage中读取
        //_user.value = {}
        //在JS中
        //1.空对象{}：使用if判断，会返回true
        //2.空字符串""，用if判断，会返回False
        if(Object.keys(_user.value)==0){
            let user_str = localStorage.getItem(USER_KEY)
            //从LocalStorage获取的USER_KEY不为空，才进行赋值
            if(user_str){
                _user.value = JSON.parse(user_str)
            }
        }
        return _user.value
    })

    function clearUserToken(){
        localStorage.removeItem(USER_KEY)
        localStorage.removeItem(TOKEN_KEY)
    }


    //计算机属性
    let token = computed(()=>{
        //如果_user是一个空对象，那么就试图从LocalStorage中读取
        if(!_user.token){
            let token_str = localStorage.getItem(TOKEN_KEY)
            if(token_str){
                _token.value = token_str
            }
        }
        return _token.value
    })

    //登录状态
    let is_logined = computed(()=>{

        // console.log("user.value", user.value)
        // console.log("token.value", token.value)
        
        if(Object.keys(user.value).length>0 && token.value){
            return true
        }
        return false
    })

    let own_permissions = computed(() => {
        // 0b000
        let _permissions = PermissionChoices.Staff
        
        // 如果用户已登录
        if(is_logined.value){
          // 判断是否是董事会成员
          if(user.value.department.name == '董事会'){
            // 0b000 | 0b001 = 0b001
            _permissions |= PermissionChoices.Boarder
          }
          // 判断是否是team leader
          if(user.value.department.leader_id == user.value.uid){
            // 0b000 | 0b010 = 0b010
            _permissions |= PermissionChoices.Leader
          }
        }  
        return _permissions
      })


    function has_permission(permissions, opt='|'){

        // opt可选值：
        // 1. |：或运算
        // 2. &：且运算 (两个二进制数据进行且运算，如果完全相等，则返回其本身)
        // own_permissions: 0b011(同时拥有leader、boarder的权限)
        // permissions: [0b010, 0b001]
        // 如果permissions列表中的某个权限与当前用户的权限相等，则会包含True(这代表用户具备访问权限)
        let results = permissions.map((permission) => (permission&own_permissions.value)==permission)


        // results = [true, false, false, true]
        if(opt == "|"){
            // 或：在其中发现一个true，即为true(具备访问权限)
            if(results.indexOf(true) >= 0){
            return true;
            }else{
            return false;
            }
        }else{
            // 与：在其中发现一个False，即为True(必须具备所有权限才可以访问)
            if(results.indexOf(false) >= 0){
            return false;
            }else{
            return true
            }
        }
    }

    //想让外面返回到，就必须得返回
  return { setUserToken, user, token, is_logined, clearUserToken, has_permission }

})
